#include <stdio.h>
#include "spi_9bit.h"
#include "i2c.h" // 需要实现I2C通信的底层驱动

// 初始化SC18IS602B,配置为9位SPI模式
int spi_init(void)
{
    uint8_t config;
    
    // Configure SPI interface
    config = SPI_CONFIG_9BIT |         // 9-bit data length
             (SPI_CLK_1843KHZ << 2) |  // Clock rate
             (SPI_MODE_0 << 4);        // SPI mode
             
    // Send configuration command
    if(i2c_write(SC18IS602B_ADDR, FUNC_SPI_CONFIG, &config, 1) != 0) {
        printf("Failed to configure SC18IS602B\n");
        return SPI_ERROR;
    }
    
    return SPI_SUCCESS;
}

// 发送9位数据
int spi_write_9bit(uint16_t *data, uint8_t len)
{
    uint8_t tx_buf[32];  // 临时缓冲区
    uint8_t bytes = 0;
    
    // 将16位数据打包成9位格式
    for(int i = 0; i < len; i++) {
        // 低8位
        tx_buf[bytes++] = data[i] & 0xFF;
        // 第9位存储在下一个字节的最低位
        if(i % 8 == 7 || i == len-1) {
            tx_buf[bytes++] = (data[i] >> 8) & 0x01;
        }
    }
    
    // 发送数据
    if(i2c_write(SC18IS602B_ADDR, FUNC_SPI_TRANSFER, tx_buf, bytes) != 0) {
        printf("SPI write failed\n");
        return SPI_ERROR;
    }
    
    return SPI_SUCCESS;
}

// 接收9位数据
int spi_read_9bit(uint16_t *data, uint8_t len) 
{
    uint8_t rx_buf[32];
    uint8_t bytes;
    
    // 发送读取命令并接收数据
    if(i2c_read(SC18IS602B_ADDR, FUNC_SPI_TRANSFER, rx_buf, &bytes) != 0) {
        printf("SPI read failed\n");
        return SPI_ERROR;
    }
    
    // 将接收到的9位数据解包成16位格式
    for(int i = 0; i < len; i++) {
        data[i] = rx_buf[i];  // 低8位
        if(i % 8 == 7 || i == len-1) {
            // 第9位在单独的字节中
            data[i] |= (rx_buf[i/8 + i] & 0x01) << 8;
        }
    }
    
    return SPI_SUCCESS;
}

// 同时发送和接收9位数据
int spi_transfer_9bit(uint16_t *tx_data, uint16_t *rx_data, uint8_t len)
{
    uint8_t tx_buf[32];  // 临时缓冲区
    uint8_t rx_buf[32];
    uint8_t bytes = 0;
    
    // 将所有数据打包到一个缓冲区
    for(int i = 0; i < len; i++) {
        // 低8位
        tx_buf[bytes++] = tx_data[i] & 0xFF;
        // 第9位存储在下一个字节的最低位
        if(i % 8 == 7 || i == len-1) {
            tx_buf[bytes++] = (tx_data[i] >> 8) & 0x01;
        }
    }
    
    // 发送数据
    if(i2c_write(SC18IS602B_ADDR, FUNC_SPI_WRITE_BUF, tx_buf, bytes) != 0) {
        printf("SPI transfer failed\n");
        return SPI_ERROR;
    }
    
    // 再读取数据
    if(i2c_read(SC18IS602B_ADDR, FUNC_SPI_TRANSFER, rx_buf, &bytes) != 0) {
        printf("SPI read failed\n");
        return SPI_ERROR;
    }
    
    // 解析接收到的数据
    for(int i = 0; i < len; i++) {
        rx_data[i] = rx_buf[i];  // 低8位
        if(i % 8 == 7 || i == len-1) {
            rx_data[i] |= (rx_buf[i/8 + i] & 0x01) << 8;
        }
    }
    
    return SPI_SUCCESS;
} 